package com.example.mq.common;

import java.io.*;

/**
 * @Description: 序列化/反序列化
 * @Author: liudong
 * @Time: 2024/5/11
 */

//下列的逻辑，并不仅仅是Message其他的Java中的对象，也可以通过这样的逻辑进行序列化和反序列化
//如果要实现序列化/反序列化，就需要让这个类实现Serializable接口

public class BinaryTool {
    //把一个对象序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //这个流对象，相当于一个变长的字节数组
        //就可以把object序列化的数据给逐渐的写入到byteArrayOutputStream中，再统一转成byte[]
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                //此处的writeObject就会把该对象进行序列化，生成二进制字节数据
                //就会写入到 objectOutPutStream中
                //由于ObjectOutPutStream又关联到了ByteArrayOutputStream
                //最终结果就写入到ByteArrayOutputStream中
                objectOutputStream.writeObject(object);
            }
            //这个操作就是把byteArrayOutputStream中持有的二进制数据取出来，转成byte[]
            return byteArrayOutputStream.toByteArray();

        }
    }

    //把一个字节数组反序列化成一个对象
    public static Object FromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                //此处的readObject，就是从data这个byte[]中读取数据并进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
